package br.urca.controller;

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.TimeZone;

import javax.annotation.PostConstruct;
import javax.inject.Inject;
import javax.servlet.ServletContext;

import br.com.caelum.vraptor.Controller;
import br.com.caelum.vraptor.Get;
import br.com.caelum.vraptor.Post;
import br.com.caelum.vraptor.Result;
import br.com.caelum.vraptor.observer.download.Download;
import br.urca.dao.DocumentoEmitidoDAO;
import br.urca.dao.SolicitacaoCarteirinhaDAO;
import br.urca.interceptor.InterceptResource;
import br.urca.model.SolicitacaoCarteirinha;
import br.urca.model.SolicitacaoCarteirinhaPK;
import br.urca.session.UsuarioLogado;
import br.urca.util.ESituacaoCarteirinha;
import br.urca.util.XLSCarteirinha;

@InterceptResource
@Controller
public class SolicitacaoCarteirinhaController {
	
	private static final String MSG_ALUNO_NAO_REGULAR = "Não é possível realizar a solicitação, pois sua situação não está regular.";
	private static final String MSG_ALUNO_SEM_FOTO = "Não é possível realizar a solicitação, pois você ainda não enviou sua foto.";
	
	private UsuarioLogado usuarioLogado;
	private ServletContext context;
	private Result result;
	private DocumentoEmitidoDAO mEmitidosDAO;
	private SolicitacaoCarteirinhaDAO mCarteirinhaDAO;
	
	private boolean podeSolicitar = false;
	
	@Deprecated public SolicitacaoCarteirinhaController() { }

	@Inject
	public SolicitacaoCarteirinhaController(UsuarioLogado usuarioLogado,
			ServletContext context, Result result,
			DocumentoEmitidoDAO mEmitidosDAO,
			SolicitacaoCarteirinhaDAO mCarteirinhaDAO) {
		super();
		this.usuarioLogado = usuarioLogado;
		this.context = context;
		this.result = result;
		this.mEmitidosDAO = mEmitidosDAO;
		this.mCarteirinhaDAO = mCarteirinhaDAO;
	}
	
	@Get("/identidadeEstudantil")
	public void index() {
		
	}
	
	@Post("/identidadeEstudantil")
	public void solicitar() {
		try {
			Calendar calendar = Calendar.getInstance(TimeZone.getDefault());
			SolicitacaoCarteirinha soli = new SolicitacaoCarteirinha();
			soli.setId(new SolicitacaoCarteirinhaPK(usuarioLogado.getAluno().getMatricula(), getNumeroVia()));
			soli.setSituacao((short) ESituacaoCarteirinha.PENDENTE.getTipo());
			soli.setDataSolicitacao(calendar.getTime());
			soli.setCodCursoTurno(usuarioLogado.getAluno().getCodCursoTurno());
			mCarteirinhaDAO.salvar(soli);
			this.result.redirectTo(this).index();
		} catch(Exception e) {
			this.result.include("erro", e.getMessage()).redirectTo(this).index();
		}
		
	}
	
	public Download dadosCarteirinha() {				
		
		List<XLSCarteirinha> mListExport = new ArrayList<XLSCarteirinha>();
		
		
		return null;
	}
	
	@PostConstruct
	public void verificaSePodeSolicitar() {
		if (usuarioLogado.getAluno().getSituacao().getId().equalsIgnoreCase(AlunosCursoController.SITUACAO_REGULAR)) {
			
			String imagem = context.getInitParameter("pathFotos") + "/"
					+ usuarioLogado.getAluno().getMatricula() + ".jpg";		
			
			File file = new File(imagem);
			if (file.exists()) {
				this.podeSolicitar = true;
				List<SolicitacaoCarteirinha> mListSolicitacoes = mCarteirinhaDAO.getList(usuarioLogado.getAluno().getMatricula());
				List<Carteirinha> mList = new ArrayList<SolicitacaoCarteirinhaController.Carteirinha>();
				if (mListSolicitacoes != null && !mListSolicitacoes.isEmpty()) {
					for (SolicitacaoCarteirinha soli: mListSolicitacoes) {
						if (soli.getSituacao() == ESituacaoCarteirinha.PENDENTE.getTipo()) {
							this.podeSolicitar = false;						
						}
						mList.add(new Carteirinha(
								(soli.getSituacao() == ESituacaoCarteirinha.PENDENTE
										.getTipo() ? "PENDENTE" : "EMITIDA"),
										"CARTÃO DE IDENTIDADE ESTUDANTIL",
										soli.getId().getVia(), 
										soli.getDataSolicitacao(), 
										soli.getDataEmissao()));
					}
				}	
				this.result.include("podeSolicitar", this.podeSolicitar)
						.include("carteirinhas", mList);
			} else {
				this.result.include("erro", MSG_ALUNO_SEM_FOTO);
			}
		} else {
			this.result.include("erro", MSG_ALUNO_NAO_REGULAR);
		}
	}
	
	private short getNumeroVia() {
		short via = 0;
		List<SolicitacaoCarteirinha> mListSolicitacoes = mCarteirinhaDAO.getList(usuarioLogado.getAluno().getMatricula());
		if (mListSolicitacoes != null && !mListSolicitacoes.isEmpty()) {
			via = (short) mListSolicitacoes.size();
		} 
		via++;
		return via;
	}
	
	public class Carteirinha {
		private String tipo;
		private String situacao;
		private short via;
		private Date dataSolicitacao;
		private Date dataEmissao;
		
		public Carteirinha(String situacao, String tipo, short via, Date dataSolicitacao,
				Date dataEmissao) {
			super();
			this.situacao = situacao;
			this.tipo = tipo;
			this.via = via;
			this.dataSolicitacao = dataSolicitacao;
			this.dataEmissao = dataEmissao;
		}

		public String getTipo() {
			return tipo;
		}

		public String getSituacao() {
			return situacao;
		}

		public short getVia() {
			return via;
		}

		public String getDataSolicitacao() {
			if (dataSolicitacao != null) {
				SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:SS");
				return sdf.format(dataSolicitacao);
			} else {
				return " -- ";
			}
		}

		public String getDataEmissao() {
			if (dataEmissao != null) {
				SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:SS");
				return sdf.format(dataEmissao);
			} else {
				return " -- ";
			}
		}
		
	}

}
